1. לא הבנתי את הדוגמה הבאה שבתחילת המדריך הזה:
מה קורה עם המחלקה b? בשביל מה היא שם?
2. "אנו יכולים בתוך abstract class לבחור שמתודה מסוימת גם כן תהיה abstract. זה יכפה על כל class שיורש את ה-abstract class שלנו להגדיר את המתודה הזו בעצמו."
למה לא פשוט להגדיר את המתודה כ-Private? מה ההבדל?
interface my_interface {
public function hello($arg1, $arg2, $date);
}
class a {
public function hello($arg1, $arg2, $date) {
return "$arg1 $arg2 in $date";
}
}
class b extends a implements my_interface{
public function hello($arg1, $arg2, $date) {
a::hello($arg1, $arg2, date('Y-M-j'));
}
}
class c extends a implements my_interface{
public function hello($arg1, $arg2, $date) {
return 'I am C and I don\'t care about stupid arg';
}
}
$a = new a();
print $a->hello('hello','world', date('Y-M-j'));
$c = new c();
print $c->hello('hello','world', date('Y-M-j'));
public function hello($arg1, $arg2, $date);
}
class a {
public function hello($arg1, $arg2, $date) {
return "$arg1 $arg2 in $date";
}
}
class b extends a implements my_interface{
public function hello($arg1, $arg2, $date) {
a::hello($arg1, $arg2, date('Y-M-j'));
}
}
class c extends a implements my_interface{
public function hello($arg1, $arg2, $date) {
return 'I am C and I don\'t care about stupid arg';
}
}
$a = new a();
print $a->hello('hello','world', date('Y-M-j'));
$c = new c();
print $c->hello('hello','world', date('Y-M-j'));
מה קורה עם המחלקה b? בשביל מה היא שם?
2. "אנו יכולים בתוך abstract class לבחור שמתודה מסוימת גם כן תהיה abstract. זה יכפה על כל class שיורש את ה-abstract class שלנו להגדיר את המתודה הזו בעצמו."
למה לא פשוט להגדיר את המתודה כ-Private? מה ההבדל?
2 תשובות
ענה
iiddaannyy
ב
03 לאוגוסט 2012
#
1. הוא פשוט לא השתמש בה. הכוונה היא שהמתודה hello ממומשת בכמה צורות, תלוי מאיזו מחלקה קוראים לה.
2. אין קשר בין רמת כימוס פרטית (private) לבין מתודה אבסטרקטית.
באופן כללי, מחלקה אבסטרקטית היא מחלקה שאי אפשר ליצור ממנה מופעים, אלא רק לרשת ממנה.
חוץ מזה, בתוך המתודה האבסטרקטית אפשר להגדיר מתודות כאבסטרקטיות, זה אומר שכל מי שיורש מהמחלקה יהיה חייב לממש (לכתוב) את המתודה הזו בעצמו, דוגמה:
abstract class AbsClass {
public abstract function hello();
}
class MyClass extends AbsClass {
public function someMethod() {
return 'hello';
}
}
public abstract function hello();
}
class MyClass extends AbsClass {
public function someMethod() {
return 'hello';
}
}
הקוד למעלה יחזיר שגיאה. למה? כי MyClass יורשת מהמחלקה AbsClass שהגדירה את המתודה hello כמתודה אבסטרקטית, מה שאומר ש-MyClass חייבת לממש את המתודה hello. בגלל שהיא לא מימשה, תהיה שגיאה.
לעומת זאת:
abstract class AbsClass {
public abstract function hello();
}
class MyClass extends AbsClass {
public function someMethod() {
return 'hello';
}
public function hello() {
return 'hello from MyClass';
}
}
public abstract function hello();
}
class MyClass extends AbsClass {
public function someMethod() {
return 'hello';
}
public function hello() {
return 'hello from MyClass';
}
}
כאן לא תהיה שגיאה, כי MyClass מימשה את המתודה האבסטרקטית.